250. find指令筆記
WHY
最近在弄crontab的問題,
結果才發現find 加上 delete滿滿的細節。
Note
- 搜尋時間
這邊要先知道一件事,atime, mtime , ctime 都是用n*24 hour
作為時間比對的依據,
判斷文件距離上次修改時間已經過了幾個24個小時時段。
find . -mtime -1 # 找到最後修改時間為「少於 1 天前」的檔案。
find . -mtime 1 # 找到最後修改時間為「剛好 1 天前」的檔案。
find . -mtime +1 # 找到最後修改時間為「超過 1 天前」的檔案。
假設現在時間 星期四 14:55
-mtime -1 最後修改時間 是 星期三的14:55到星期四的14:55之間的檔案
-mtime 1 最後修改時間是 星期二14:55到 星期三的14:55的檔案
-mtime +1 最後修改時間是 星期二14:55之前的檔案
其他還有這兩個參數可供使用
-atime 最近訪問時間
-ctime 最近狀態改動時間
這幾個時間都可用stat查看
這張圖表示 -5,5,+5的差別
如果要查詢分鐘的話,
則是使用 -amin,-mmin,-cmin 用法跟上面差不多。
- 查看說明文件
man find
- 搜尋類型
find . -type f # 搜尋檔案
find . -type d # 搜尋資料夾
- 搜尋檔案名稱
find . -iname "docker" # 不區分大小寫
find . -name "*.mp4" # 副檔名為mp4
- 執行後再其他指令
find . -iname "docker" -exec rm -f {} +
{}
代表將前面搜尋的結果傳到後面的參數,
+
表示將結果一次傳進去給rm,另一種作法是\;
,針對每個資料夾都執行一次rm的指令
記得\
前面的空格。
- 排除特定資料夾
find . -iname "docker" -mindepth 1 -path /home/user/docker -prune -o -print
-o
在find中,代表OR的邏輯,其中一個為true才執行,
基本語法為find <path> <condition1> -o <condition2>
所以 -o -print的用意識,如果不是 /home/user/docker
的資料夾就print
ref.
單純紀錄一下麻煩的要死的cp功能,
後面還是用glcoud storage rsync處理掉,cp真的太慢了。
#!/bin/bash
total=$(find /home/user/MP4Final -type f -cmin -1 | wc -l)
find /home/user/MP4Final -type f -cmin -5 | while read file; do
# 提取檔案名稱
filename=$(basename "$file")
# 提取最後兩個資料夾名稱
last_two_dirs=$(echo "$file" | awk -F/ '{print $(NF-2) "/" $(NF-1)}')
# 目標位置
target_dir="video/$last_two_dirs"
#echo "source:$file"
#echo "$target_dir/$filename"
gcloud storage cp -n "$file" "gs://$target_dir/$filename" --quiet
done
echo "total: $total"